設計模式第2篇:簡單工廠、工廠方法、抽象工廠設計模式
1.簡單工廠設計模式
特點:一個抽象的產品類、多個具體的產品類、一個具體的工廠類。
(1)抽象的產品類(例如產品為手機螢幕)
public interface Screen{
void screenSize();
}
(2)具體的產品類(例如需要5英寸和6英寸的手機螢幕)
public class Screen5 implements Screen{
@Override
public void screenSize(){
System.out.println("生產5英寸的螢幕")
}
}
public class Screen6 implements Screen{
@Override
public void screenSize(){
System.out.println("生產6英寸的螢幕")
}
}
(3)一個具體工廠類(生產手機螢幕的工廠)
public class ScreenFactory {
public Screen produceScreen(int size){
if (size == 5){
return new Screen5();
}else if (size==6) {
return new Screen6();
}
}
}
使用場景:產品個數已知並且固定。
優缺點:實現簡單,當產品個數固定時推薦使用,由於增加產品種類時需要修改工廠類,所以破壞了開閉設計原則(對擴充套件開放,對修改關閉),下面 的工廠方法模式解決了這個問題。
2.工廠方法模式
特點:一個抽象的產品類,多個具體的產品類,一個抽象的工廠類,多個具體的工廠類
(1)抽象的產品類(例如產品為手機螢幕)
public interface Screen{
void screenSize();
}
(2)具體的產品類(例如需要5英寸和6英寸的手機螢幕)
public class Screen5 implements Screen{
public Screen5(){
System.out.println("生產5英寸的螢幕")
}
}
public class Screen6 implements Screen{
public Screen6(){
System.out.println("生產6英寸的螢幕")
}
}
(3)一個抽象工廠類(生產手機螢幕的抽象工廠)
public interface ScreenFactory {
public Screen produceScreen();
}
(4)生產具體螢幕尺寸的具體工廠
public class Screen5Factory implements ScreenFactory{
@Override
public Screen produceScreen(){
return new Screen5();
}
}
public class Screen6Factory implements ScreenFactory{
@Override
public Screen produceScreen(){
return new Screen6();
}
}
適用場景:與簡單工廠模式一樣,只是遵循了開閉設計原則。
3. 抽象工廠模式
當只做手機螢幕的廠家做了一段時間後發現手機市場的前景更大,於是想轉行做手機了,此時需求發生了變化,做手機不僅需要螢幕,還需要CPU、電池、儲存等,由於需要生產的產品種類越來越多,此外針對不同的使用者還需要設計不同的機型,此時前兩種工廠設計模式便已不再適用,於是有了抽象工廠模式。
特點:一個抽象工廠,多個具體工廠,多個抽象產品,多個具體產品
(1)多個抽象產品類(CPU產品類、螢幕產品類、電池產品類)
public interface Cpu{
void run();
}
public interface Screen{
void screenSize();
}
public interface Power{
void powerCapacity();
}
(2)多個具體產品類(CPU具體產品類、螢幕具體產品類、電池具體產品類)
public class Cpu650 implements Cpu{
@Override
public void run(){
System.out.println("生產cpu650");
}
}
public class Cpu850 implements Cpu{
@Override
public void run(){
System.out.println("生產cpu850");
}
}
public class Screen5 implements Screen{
@Override
public void screenSize(){
System.out.println("生產5英寸屏");
}
}
public class Screen6 implements Screen{
@Override
public void screenSize(){
System.out.println("生產6英寸屏");
}
}
public class power3000 implements power{
@Override
public void powerCapacity(){
System.out.println("生產3000毫安電池");
}
}
public class power4000 implements power{
@Override
public void powerCapacity(){
System.out.println("生產4000毫安電池");
}
}
(3)一個抽象工廠類(生產手機的工廠類)
public interface PhoneFactory{
Cpu produceCpu();
Screen produceScreen();
Power producePower();
}
(4)多個具體工廠類(生產不同型號的手機用不同的具體工廠類)
public class premiumPhone implements Phone{
@Override
public Cpu produceCpu(){
return new Cpu850();
}
@Override
public Power producePower(){
return new Power4000();
}
@Override
public Screen produceScreen(){
return new Screen6();
}
}
public class lowendPhone implements Phone{
@Override
public Cpu produceCpu(){
return new Cpu650();
}
@Override
public Power producePower(){
return new Power3000();
}
@Override
public Screen produceScreen(){
return new Screen5();
}
}
適用場景:產品物件多樣,產品之間存在相互依賴或關聯關係。
優缺點:優點就是適用於構造大量、不同層次的產品。