1. 程式人生 > >【Android】三種工廠模式簡析

【Android】三種工廠模式簡析

簡單介紹三種工廠模式:簡單工廠模式,工廠方法模式,抽象工廠模式
1.簡單工廠模式
這是一個小工廠,什麼都由自己生產,別人要什麼就呼叫自己的相應工具去生產
具備三個特徵:具體工廠A,具體生產工具B,抽象生產物件C
就是 A呼叫工具B去生產C,工具可以有多種(我成為類B工具),每種生產對應的產品(類C產品,C是所有產品的父介面),下面看程式碼

//抽象產品角色:交通工具車   類C
    public abstract class Car
    {
        public virtual void GoToWork()
        {
        }
    }

    //具體產品角色:自行車  工具B
public class Bike : Car { public override void GoToWork() { Console.WriteLine("騎自行車去上班"); } } //具體產品角色:公交車 工具B public class Bus : Car { public override void GoToWork() { Console.WriteLine("做公交車去上班"); } } //工廠角色:簡單工廠類
public class SimpleFactory { public static Car CreateSimple(string str) { Car simple = null; switch (str) { case "Bike": simple = new Bike(); break; case "Bus": simple = new
Bus(); break; //…… } return simple; } } Car car = SimpleFactory.CreateSimple("Bus"); car.GoToWork();

2.工廠方法模式
就像一個公司做大了,涉及的業務多了,管理就不方便了,這時候往往會成了子公司,讓每一個子公司去負責一塊業務,自己就稱為了管理子公司的母公司,而不涉及具體的業務(抽象) 所以就有四 個角色: 母公司 ->抽象工廠 ,子公司 -> 具體工廠, 產品類 -> 抽象介面, 生產工具類 -> 具體方法

//抽象產品角色:交通工具車
    public abstract class Car
    {
        public virtual void GoToWork()
        {
        }

    }

    //具體產品角色:自行車
    public class Bike : Car
    {
        public override void GoToWork()
        {
            Console.WriteLine("騎自行車去上班");
        }
    }
    //具體產品角色:公交車
    public class Bus : Car
    {
        public override void GoToWork()
        {
            Console.WriteLine("做公交車去上班");
        }
    }

    //抽象工廠角色:工廠介面
    public interface IFactory
    {
        Car ByWhatWay();
    }
    //具體工廠類:自行車類
    public class BikeFactory : IFactory
    {
        public Car ByWhatWay()
        {
            return new Bike();
        }
    }
    //具體工廠類:公交車類
    public class BusFactory : IFactory
    {
        public Car ByWhatWay()
        {
            return new Bus();
        }

    }

 //根據客戶端例項化的工廠決定如何去上班
 IFactory factory = new BusFactory();   //常規寫法
 Car car = factory.ByWhatWay();
 car.GoToWork();

3.抽象工廠模式,這個模式就是前面連個模式的結合,即做大了,成為了母公司,並且子公司也做大了,可以做很多業務。從大局來看,是工廠方法模式,從區域性看,是簡單工廠模式,就這樣,直接看程式碼

//抽象交通工具車
    public abstract class Car
    {
        //名字
        public string CarName{ get; set; }
        public virtual string GoToWork()
        {
            return CarName;
        }

    }
    //抽象早飯類
    public abstract class BreakFast
    {
        //早飯名稱
        public string FoodName { get; set; }

        public virtual string Eat()
        {
            return FoodName;
        }
    }

    //自行車
    public class Bike : Car
    {
        public override string GoToWork()
        {
            CarName = "騎著自行車";
            return CarName;
        }
    }
    //公交車
    public class Suv: Car
    {
        public override string GoToWork()
        {
            CarName = "開著SUV汽車";
            return CarName;
        }
    }

    //高逼格早飯:三明治牛奶
    public class SandWichAndMilk : BreakFast
    {
        public override string Eat()
        {
            FoodName = "三明治和牛奶";
            return FoodName;
        }
    }

    //苦逼早飯:包子豆漿
    public class BaoziAndDoujiang : BreakFast
    {
        public override string Eat()
        {
            FoodName = "包子豆漿";
            return FoodName;
        }
    }

    //抽象工廠類
    public abstract class AbstractFactory
    {
        //建立交通工具方法
        public abstract Car CreatCar();

        //建立早飯方法
        public abstract BreakFast CreateBreakFast();

    }

    //具體工廠類:苦逼程式設計師
    public class LowFactory : AbstractFactory
    {
        public override Car CreatCar()
        {
            return new Bike();
        }

        public override BreakFast CreateBreakFast()
        {
            return new BaoziAndDoujiang();
        }
    }
    //具體工廠類:高逼格程式設計師
    public class HighFactory : AbstractFactory
    {
        public override Car CreatCar()
        {
            return new Suv();
        }

        public override BreakFast CreateBreakFast()
        {
            return new SandWichAndMilk();
        }
    }

    public class CoderLove
    {
        private Car car;
        private BreakFast breakFast;
        public CoderLove (AbstractFactory fac)
        {
            car=fac.CreatCar();
            breakFast=fac.CreateBreakFast();
        }

        public void GetCoderLove()
        {
            Console.WriteLine("早飯吃完"+breakFast.Eat()+","+car.GoToWork()+"去上班");
        }
    }
// 選擇派哪個子公司去做
AbstractFactory factory=new HighFactory();
// 子公司和業務聯絡
 CoderLove coder=new CoderLove(factory);
 // 做事
 coder.GetCoderLove();

這裡寫圖片描述

抽象工廠模式隔離了具體類的生成,使得客戶並不需要知道什麼被建立。

由於這種隔離,更換一個具體工廠就變得相對容易。所有的具體工廠都實現了抽象工廠中定義的那些公共介面,因此只需改變具體工廠的例項,就可以在某種程度上改變整個軟體系統的行為。

除了以上苦逼程式設計師,高逼格程式設計師,還可以具體新增一個開車SUV吃著包子豆漿的具體工廠,也可以新增騎著自行車吃著三明治牛奶的具體工廠,換不同的子公司去做,就有不同的結果